/*
As3 Performances Analyzer
Copyright (C) 2011 Ankama Studio

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

Contact : seyraud@ankama.com
Project : http://code.google.com/p/as3-performances-analyzer
*/

package types
{
	import ui.components.Graph;
	
	import flash.events.EventDispatcher;
	import flash.net.SharedObject;
	import flash.utils.Dictionary;

	public class SubProvider extends EventDispatcher
	{
		//:////////////////////////////////////////////////////////
		//:// Constantes
		//:////////////////////////////////////////////////////////
		
		public static const RENDER_TYPE_GRAPH : uint	= 0;
		public static const RENDER_TYPE_ICON : uint	= 1;
		
		//:////////////////////////////////////////////////////////
		//:// Variables privées
		//:////////////////////////////////////////////////////////
		
		private static var _so : SharedObject;
		private static var _providers : Dictionary = new Dictionary;
		private static var _providersArray : Array = new Array;
		private var _color : uint;
		
		//:////////////////////////////////////////////////////////
		//:// Variables publiques
		//:////////////////////////////////////////////////////////
		
		public static var currentTimestamp : Number;
		
		/** Identifiant du provider */
		public var id : String;
		
		/** Données du provider */
		public var data : Array = [];
		
		/** Liste des champs de valeurs */
		public var valueFields : Array = [];
		
		/** Champs de valeur à utiliser par défaut */
		public var defaultValueField : String;
		
		/** Champs de valeur pour les absisses */
		public var abscissField : String;
		
		/** Echèle pour les abssisses */
		public var abscissScale : Number = 1;
		
		/** Type de rendu */
		public var renderType : uint = RENDER_TYPE_GRAPH;
		
		/** Nom du provider */
		public var label : String;
		
		/** Provider visible ou pas */
		public var visible : Boolean;
		
		/** Legend pour les tooltip (le caractère # est remplacé par la valeur) */
		public var legend : String;
		
		/** Doit-on appliquer un multiplicateur sur la valeur à afficher */
		public var valueScale : Number = 1.0;
		
		/** Nombre d'échantillons à utiliser pour la moyenne (1=pas de moyenne) */
		public var sampleStep : uint;
		
		/** Objet utiliser pour créer le provider, ne pas toucher*/
		public var localVars : Object;

		/** Classe à utiliser pour le rendu */
		public var renderer : Class;
		
		//:////////////////////////////////////////////////////////
		//:// Getter / setter
		//:////////////////////////////////////////////////////////
		
		public function get color():uint
		{
			return _color;
		}

		public function set color(value:uint):void
		{
			_color = value;
			_so.data.colors[label] = value;
			_so.flush();
		}
		
		//:////////////////////////////////////////////////////////
		//:// Constructeur
		//:////////////////////////////////////////////////////////
		
		public function SubProvider(id: String,
									label : String,
									valueFields : Array,
									defaultValueField : String,
									legend : String,
									localVars : Object = null,
									valueScale : Number = 1.0,
									sampleStep : uint = 1,
									abscissField : String = "timestamp",
									renderer : Class = null)
		{
			_providers[id] = this;
			_providersArray.push(this);
			this.id = id;
			this.label = label;
			this.valueFields = valueFields;
			this.defaultValueField = defaultValueField;
			this.abscissField = abscissField;
			this.legend = legend;
			this.valueScale = valueScale;
			this.sampleStep = sampleStep;
			this.localVars = localVars;
			if(renderer == null) renderer = Graph
			this.renderer = renderer;
			
			if(!_so)
			{
				_so = SharedObject.getLocal("graphParams");
				if(!_so.data.colors)
				{
					_so.data.colors = [];
					_so.flush();
				}
			}
			
			if(_so.data.colors)
				this.color = _so.data.colors[label];
		}
		
		//:////////////////////////////////////////////////////////
		//:// Fonctions publiques
		//:////////////////////////////////////////////////////////
		
		public static function get allProviders() : Array
		{
			return _providersArray;
		}
		
		public static function get(name : String) : SubProvider
		{
			return _providers[name];
		}	
		
		public function addValue(o:Object, timestamp : Number = -1) : void
		{
			if(!o.hasOwnProperty("timestamp") || timestamp != -1) o.timestamp = timestamp;
			data.push(o);
		}
	}
}